package jp.co.toshiba.ffsa.action.csde;

import java.io.PrintWriter;
import java.util.ArrayList;

import javax.annotation.Resource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import jp.co.toshiba.ffsa.action.common.CommonAction;
import jp.co.toshiba.ffsa.common.Crypto;
import jp.co.toshiba.ffsa.form.csde.Csde301Form;
import jp.co.toshiba.ffsa.service.common.ConstantValue;
import jp.co.toshiba.ffsa.service.csde.Csde301Service;

import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.ActionMessagesUtil;
import org.seasar.struts.util.MessageResourcesUtil;
import org.seasar.struts.util.RequestUtil;
import org.seasar.struts.util.ResponseUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * 設計I/F - プロジェクト詳細
 * @author npc
 */
public class Csde301Action extends CommonAction{

    /** 画面ID */
    public String screenID = "CSDE301";

    /** アクションフォーム */
    @ActionForm
    @Resource
    protected Csde301Form csde301Form;

    /**
     * 初期処理
     * @return 画面遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String index() throws Exception {

        try {
            // ログイン済判定する
            if (!judgeLogin(csde301Form.getSessionId())) {
                return topTransition;
            }

            // リファラ判定
            if (!judgeRefferer()) {
                return topTransition;
            }

            // 暗号化されていた機密情報を復号
            decryptSecretData();

            // 検索処理
            search();

            // 機密情報を暗号化
            encryptSecretData();

            return "/csde/csde301.jsp";

        } catch (Exception e) {
            errorLogWriter(e, "index", screenID);
            throw e;
        }
    }

    /**
     * 設計書アップロード警告
     * @return 画面遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String uploaded() throws Exception {

        try {
            // ログイン済判定する
            if (!judgeLogin(csde301Form.getSessionId())) {
                return topTransition;
            }

            // リファラ判定
            if (!judgeRefferer()) {
                return topTransition;
            }

            // 暗号化されていた機密情報を復号
            decryptSecretData();

            // エラーメッセージ
            ActionMessages messages = new ActionMessages();
            messages.add("uploaded", new ActionMessage("errors.fileUploaded", true));
            ActionMessagesUtil.addErrors(RequestUtil.getRequest().getSession(true), messages);

            // 検索処理
            search();

            // 機密情報を暗号化
            encryptSecretData();

            return "/csde/csde301.jsp";

        } catch (Exception e) {
            errorLogWriter(e, "uploaded", screenID);
            throw e;
        }
    }

    /**
     * 設計書ダウンロード処理
     * @param file ダウンロードするファイル名
     * @return
     * @throws Exception
     */
    @Execute(validator = false)
    public String download() throws Exception {

        try {
            // ログイン済判定する
            if (!judgeLogin(csde301Form.getSessionId())) {
                return topTransition;
            }

            // リファラ判定
            if (!judgeRefferer()) {
                return topTransition;
            }

            // 暗号化されていた機密情報を復号
            decryptSecretData();

            String transition = null;
            String result = "";
            boolean successFlag = false;
            Csde301Service csde301Service = new Csde301Service();
            successFlag = csde301Service.downloadFile(csde301Form.fileName);

            if (!successFlag) {
                // エラー画面へ
                result = ConstantValue.fail;
                transition = "/cser/cser101.jsp";
            } else {
                result     = ConstantValue.success;
                transition = null;
            }

            if (ConstantValue.success.equals(result)) {
                // 操作ログ記述
                ArrayList<ArrayList<String>> parameters = new ArrayList<ArrayList<String>>();
                ArrayList<String> parameterNames = new ArrayList<String>();
                ArrayList<String> values = new ArrayList<String>();
                parameterNames.add(MessageResourcesUtil.getMessage("file_name"));
                values.add(csde301Form.fileName);
                parameters.add(parameterNames);
                parameters.add(values);
                entryOperationHistory(screenID, "download", parameters, result);
            }

            // 機密情報を暗号化
            encryptSecretData();

            return transition;

        } catch (Exception e) {
            errorLogWriter(e, "download", screenID);
            throw e;
        }
    }

    /**
     * 検索処理
     * @throws Exception
     */
    public void search() throws Exception {
        // Serviceクラスを呼び出す
        Csde301Service csde301Service = new Csde301Service();

        csde301Service.setProjectId(csde301Form.projectId);

        // プロジェクト詳細情報取得
        csde301Form.projectDetailList = csde301Service.getProjectDetail();

        // ファイル(IN)情報取得
        csde301Form.inFileList = csde301Service.getFileList("IN");

        // ファイル(OUT)情報取得
        csde301Form.outFileList = csde301Service.getFileList("OUT");

    }

    private void encryptSecretData() throws Exception {
        csde301Form.projectId = Crypto.encrypt(csde301Form.projectId);
    }

    private void decryptSecretData() throws Exception {
        csde301Form.projectId = Crypto.decrypt(csde301Form.projectId);
    }

    /**
     * BASIC認証ID、パスワード取得
     * @throws Exception
     */
    @Execute(validator = false)
    public String basicValue() throws Exception {
        PrintWriter out = null;
        try{
            if(RequestUtil.getRequest().getHeader("REFERER") != null && RequestUtil.getRequest().getHeader("REFERER").indexOf("csde/csde301") != -1){
                // 文字コードとMIMEタイプを指定する
                ResponseUtil.getResponse().setContentType("text/xml; charset=UTF-8");

                // 出力ストリームを取得する
                out = ResponseUtil.getResponse().getWriter();

                // DOM Documentのインスタンスを生成するBuilderクラスの
                // インスタンスを取得する
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                //ビルダーからDOMを取得する
                Document document = builder.newDocument();

                // XMLのルート要素を追加する
                Element user = document.createElement("basic");
                document.appendChild(user);

                // ルート要素に子ノードを追加する
                Element name = document.createElement("value1");
                user.appendChild(name);
                // タグのテキストを追加する
                name.appendChild(document.createTextNode(MessageResourcesUtil.getMessage("basic_auth_id")));

                // ルート要素に子ノードを追加する
                name = document.createElement("value2");
                user.appendChild(name);
                // タグにテキストを追加する
                name.appendChild(document.createTextNode(MessageResourcesUtil.getMessage("basic_auth_pass")));

                // DOMの内容をクライアントに出力する
                TransformerFactory tfactory = TransformerFactory.newInstance();
                Transformer transformer = tfactory.newTransformer();
                transformer.transform(new DOMSource(document), new StreamResult(out));
            }
        }catch(Exception e){
        }finally{
            if(out != null){
                try{
                    out.close();
                }catch(Exception e){}
            }
        }
        return null;
    }
}